import { _decorator, Component, JsonAsset, Node, sys } from 'cc';
import Singleton from '../../../FrameWork3.8.6/FrameWork/Common/Singleton';
import { PlayerPropertyBase } from '../../UI/PlayerPropertyBase';
import { PropertyDt } from '../../../FrameWork3.8.6/FrameWork/Common/CommonInterface';
const { ccclass, property } = _decorator;

@ccclass('BagManager')
//这是背包数据管理者，在游戏中拾取到装备时，采用数据先行UI后刷新的操作，而数据就存储在该管理者中
export class BagManager extends Component{
    //将其设置为单例全局变量
    private static _instance:BagManager=null;
    static get instance(){
        if(!this._instance){
            this._instance=new BagManager();
        }
        return this._instance;
    }

    //每次一打开就加载历史装备数据
    protected onLoad(): void {
        this.loadBagDt();
    }


    //存储装备信息，技能信息，兵种信息的容器
    private  _mapBagDt:Map<string,PropertyDt[]>=new Map();

    //存储已经装备的装备信息，技能信息，兵种信息的容器
    private _mapEquipBagDt:Map<string,PropertyDt[]>=new Map();
    /**
     * //添加背包数据中间接口
     * @param name 数据的type
     * @param propertyDt 数据
     * @param isEquiped 是否是已装备的数据
     * @returns 
     */
    addBagDt(name:string,propertyDt:PropertyDt,isEquiped:boolean){
        if(!name||name.length<=0||!propertyDt){
            console.log("添加背包数据时传参数错误")
        }
        if(isEquiped){
            //后续可改进为修改参数性能会更高
            //由于是已经装备的因此无法装备两个相同Kind
            let arrProperty=this._mapEquipBagDt.get(name);
            if(arrProperty){
                for(let i=0;i<arrProperty.length;i++){
                    if(arrProperty[i].kind==propertyDt.kind){
                        arrProperty[i]=propertyDt;//旧的数据替换为新的数据
                        return;
                    }
                }
            }
            this.addTrueBagDt(name,propertyDt,this._mapEquipBagDt,"EquipedBagDt")
            return;   
        }
        this.addTrueBagDt(name,propertyDt,this._mapBagDt,"OwnBagDt");
    }

    //真正处理添加背包数据的接口
    addTrueBagDt(name:string,propertyDt:PropertyDt,mapBagDtBase:Map<string,PropertyDt[]>,saveName:string){
        //这里即便重复我也正常重复
        let arrProperty=mapBagDtBase.get(name);
        if(!arrProperty){
            arrProperty=[];
            mapBagDtBase.set(name,arrProperty);
        }
        arrProperty.push(propertyDt);
        //每次刷新背包数据都将他存储
        this.saveBagDt(saveName);
    }

    
    /**
     * //获取背包数据接口
     * @param name 数据的type
     * @param isEquiped 是否已装备
     * @returns 
     */
    getBagDt<T extends PropertyDt>(name:string,isEquiped:boolean):T[]{
        if(isEquiped){
            let arrProperty=this.getTrueBagDt<T>(name,this._mapEquipBagDt);
            return arrProperty;
        }
        let arrProperty=this.getTrueBagDt<T>(name,this._mapBagDt);
        return arrProperty;
    }

    //真正处理获取背包数据的接口
    getTrueBagDt<T extends PropertyDt>(name:string,mapBagDtBase:Map<string,PropertyDt[]>):T[]{
        if(!name||name.length<=0||mapBagDtBase.has(name)){
            console.log("获取背包数据时传参数错误");
        }
        let arrProperty=mapBagDtBase.get(name);
        return arrProperty as T[];
    }


    //从本地存储中加载历史装备数据
    private loadBagDt(){
        let bagDtStr=localStorage.getItem("BagDt");
        if(bagDtStr){
            //反序列化成数据
            this._mapBagDt=JSON.parse(bagDtStr);
        }
    }

    //将背包数据保存在本地当中(Json序列化)
    private saveBagDt(saveName:string){
        //因为是用json序列化成字符串
        let bagDtStr=JSON.stringify(this._mapBagDt);
        localStorage.setItem(saveName,bagDtStr);
    }


    //删除本地存档
    private clearBagDt(){
        localStorage.removeItem("BagDt");
    }
}


